package com.cskaoyan.javase.oop1._11import._0onepackage;

/**
 * @description: import关键字
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

//import com.cskaoyan.javase.oop1._11import._1anotherpackage.B;
//import com.cskaoyan.javase.oop1._11import._1anotherpackage.A;
import com.cskaoyan.javase.oop1._11import._1anotherpackage.*;


/**
 * import关键字是用来进行导包的
 * Java当中查找一个类的优先级:
 *      1,在同包下,类名是绝对唯一的,不存在需要抉择的情况,所以编译器是可以通过类名直接去查找到对应的类的,都不需要去做额外的操作,不需要导包
 *      2,在不同包下,类名不是唯一的,这样编译器无法通过一个类名就确定一个类,所以如果想要使用不同包下的类,必须导包
 *
 * 导包就是告诉编译器,使用的class到底是哪个包下的
 * 语法:
 *      import + 包名 + 类名
 *      import + 全限定类名
 * 使用注意事项:
 *      1,应该写在package声明的下面,正式class代码的上面
 *          建议直接写在package声明下面
 *      2,当同包和不同包下都有同名类时,因为就近原则,优先选择同包下的class
 *          如果想要使用不同包下的同名类,是可以通过导包语句做到的,但是要分情况:
 *          1,同名的类如果是同包但是不同编译单元,比如B类,这时是可以通过导包使用的
 *          2,同名的类如果是同包但也是同一个编译单元时,比如A类
 *      3,import关键字存在智能导包的形式,会智能的根据需要导入需要的类
 *          语法: import + 包名 + *;
 *          *表示通配,可以匹配该包下的所有的类
 *          需要注意的是,智能导包只有等到必须导包时,才会导入,否则不会导入(如果同包下有同名类则不会导入)
 *      4,java.lang包是java核心类包,不需要程序员手动导入,而是隐式导入了
 *      5,如果我想同时使用同包和不同包下的同名类,这个时候就必须有一个要使用全限定类名去访问
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        //同包但是不同编译单元(同包不是一个Java文件)
        B b = new B();
        b.test();
        com.cskaoyan.javase.oop1._11import._1anotherpackage.B b2 = new com.cskaoyan.javase.oop1._11import._1anotherpackage.B();
        b2.test();


        //C c = new C();
    }
}
//'A' is already defined in this compilation unit
//class A {
//}